let Disp = require("../../utils/Dispatcher.js");

let msgPackager = require("./msgpackager.js");

let msgType = require("./msgtype.js");

let msgStorage = new Disp();

let disp = require("../../utils/broadcast.js");

msgStorage.saveReceiveMsg = function(receiveMsg, type) {
	let sendableMsg;

	if (type == msgType.IMAGE) {
		sendableMsg = {
			id: receiveMsg.id,
			type: type,
			body: {
				id: receiveMsg.id,
				from: receiveMsg.from,
				to: receiveMsg.to,
				type: receiveMsg.type,
				ext: receiveMsg.ext,
				chatType: receiveMsg.type,
				toJid: "",
				body: {
					type: type,
					url: receiveMsg.url,
					filename: receiveMsg.filename,
					filetype: receiveMsg.filetype,
					size: {
						width: receiveMsg.width,
						height: receiveMsg.height
					}
				}
			}
		};
	} else if (type == msgType.TEXT || type == msgType.EMOJI) {
		sendableMsg = {
			id: receiveMsg.id,
			type: type,
			body: {
				id: receiveMsg.id,
				from: receiveMsg.from,
				to: receiveMsg.to,
				type: receiveMsg.type,
				ext: receiveMsg.ext,
				chatType: receiveMsg.type,
				toJid: "",
				body: {
					type: type,
					msg: receiveMsg.data
				}
			},
			value: receiveMsg.data
		};
	} else if (type == 'INFORM') { // 通知消息
		sendableMsg = {
			body: {
				from: receiveMsg.from,
				to: receiveMsg.to,
				chatType: 'INFORM',
				gid: receiveMsg.gid ? receiveMsg.gid : '',
				type: receiveMsg.type
			},
		};
	} else if (type == msgType.FILE) {
		sendableMsg = {
			id: receiveMsg.id,
			type: type,
			body: {
				id: receiveMsg.id,
				length: receiveMsg.file_length,
				from: receiveMsg.from,
				to: receiveMsg.to,
				type: receiveMsg.type,
				ext: receiveMsg.ext,
				chatType: receiveMsg.type,
				toJid: "",
				body: {
					type: type,
					url: receiveMsg.url,
					filename: receiveMsg.filename,
					msg: "当前不支持此格式消息展示"
				}
			},
			value: receiveMsg.data
		};
	} else if (type == msgType.AUDIO) {
		sendableMsg = {
			id: receiveMsg.id,
			type: type,
			accessToken: receiveMsg.token || receiveMsg.accessToken,
			body: {
				id: receiveMsg.id,
				length: receiveMsg.length,
				from: receiveMsg.from,
				to: receiveMsg.to,
				type: receiveMsg.type,
				ext: receiveMsg.ext,
				chatType: receiveMsg.type,
				toJid: "",
				body: {
					type: type,
					url: receiveMsg.url,
					filename: receiveMsg.filename,
					filetype: receiveMsg.filetype,
					from: receiveMsg.from,
					to: receiveMsg.to
				}
			}
		};
	} else if (type == msgType.VIDEO) {
		sendableMsg = {
			id: receiveMsg.id,
			type: type,
			accessToken: receiveMsg.token || receiveMsg.accessToken,
			body: {
				id: receiveMsg.id,
				length: receiveMsg.length,
				from: receiveMsg.from,
				to: receiveMsg.to,
				type: receiveMsg.type,
				ext: receiveMsg.ext,
				chatType: receiveMsg.type,
				toJid: "",
				body: {
					type: type,
					url: receiveMsg.url,
					filename: receiveMsg.filename,
					filetype: receiveMsg.filetype,
					from: receiveMsg.from,
					to: receiveMsg.to
				},
			},
		};
	} else {
		return;
	}

	this.saveMsg(sendableMsg, type, receiveMsg);
};

msgStorage.saveMsg = function(sendableMsg, type, receiveMsg) {
	let me = this;
	let myName = uni.getStorageSync("myUsername");
	let sessionKey; // 仅用作群聊收消息，发消息没有 receiveMsg

	if (receiveMsg && receiveMsg.type == "groupchat") {
		sessionKey = receiveMsg.to + myName;
	} else if (sendableMsg.body.chatType === 'INFORM') {
		sessionKey = 'INFORM'
	} else if (receiveMsg) { //如果是接收先判断自己是否是发起者，如果是，直接存储，如果不是，自己就是接受者
		
		sessionKey = (sendableMsg.body.from == myName ? myName + sendableMsg.body.to : myName + sendableMsg.body
			.from);
		let toArr = uni.getStorageSync(sessionKey);
		let renderedtoArr = uni.getStorageSync("rendered_" + sessionKey);
		console.log(sendableMsg, sessionKey, toArr, 44444)
		if (!(toArr && toArr.length > 0) && !(renderedtoArr && renderedtoArr.length > 0)) {
			sessionKey = (sendableMsg.body.from == myName ? sendableMsg.body.to + myName : sendableMsg.body.from +
				myName);
		}
		console.log(sessionKey,44444)
	} else { // 群聊发 & 单发 & 单收  发起会话时，先判断自己是否是接受者，如果是直接存储，如果不是，自己就是发起者
		sessionKey = (sendableMsg.body.from == myName ? sendableMsg.body.to + myName : sendableMsg.body.from +
			myName);
		let myArr = uni.getStorageSync(sessionKey);
		let renderedtoArr = uni.getStorageSync("rendered_" + sessionKey);
		if (!(myArr && myArr.length > 0)&& !(renderedtoArr && renderedtoArr.length > 0)) {
			sessionKey = (sendableMsg.body.from == myName ? myName + sendableMsg.body.to : myName +
				sendableMsg
				.body.from);
		}
	}

	let curChatMsg = uni.getStorageSync(sessionKey) || [];
	let renderableMsg = msgPackager(sendableMsg, type, myName);

	if (type == msgType.AUDIO) {
		renderableMsg.msg.length = sendableMsg.body.length;
		renderableMsg.msg.token = sendableMsg.accessToken;
	}

	curChatMsg.push(renderableMsg); 

	if (type == msgType.VIDEO) {
		renderableMsg.msg.token = sendableMsg.accessToken; //如果是音频则请求服务器转码
	}


	save();

	function save() {
		uni.setStorage({
			key: sessionKey,
			data: curChatMsg,

			success() {
				if (type == msgType.AUDIO || type == msgType.VIDEO) {
					disp.fire('em.chat.audio.fileLoaded');
				}

				me.fire("newChatMsg", renderableMsg, type, curChatMsg, sessionKey);
			}

		});
	}
};

module.exports = msgStorage;
